package com.wn.demo02;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;

import java.util.Random;

/**
 * @author yellow Docter
 * @date 2022 -07-07
 * @desc
 *   springaop 中的5 种 通知
 *
 *   01  前置通知
 *           在目标方法之前执行
 *
 *   02  后置通知
 *          在目标方法之后执行
 *
 *   03  异常通知
 *          出现了异常才执行
 *
 *   04  最终通知
 *          最后执行
 *
 *   05  环绕通知
 *          在目标方法前和方法后执行
 *
 */
public class MyAdvice {

    public void before(JoinPoint jp){
        System.out.println("MyAdvice.before 在目标方法之前执行");
    }

    public void afterReturn(){
        System.out.println("MyAdvice.afterReturn 在目标方法之后执行");
    }

    public void throwException(){
        System.out.println("MyAdvice.throwException 出现了异常才执行");
    }

    public void after(){
        System.out.println("MyAdvice.after  最终通知");
    }

    /**
     *  环绕通知和同其他的通知不一样
     *        需要把连接点传入进来
     *        ProceedingJoinPoint 连接点
     *        连接点 (真实对象的方法)     proceed()  就执行方法
     *        环绕通知可以 在 连接点的前面和后面进行  调用前置和后置通知
     */
    public Object around(ProceedingJoinPoint proceedingJoinPoint){

        Object result = null;
        System.out.println("MyAdvice.around 前 ");
        //proceed 调用目标方法
        try {
            result = proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

        System.out.println("MyAdvice.around 后 ");

        return result;
    }

}
